# Projeto Willian...
# coding=UTF-8
# Bibliotecas .. Incluir outras que vc usou!

import numpy
import os
import math
from scipy import stats
from scipy import spatial

def knn(matTeste, matTreino):
	# Trabalho k-NN (Nesta Gambiarra eu defino um valor para k)
	k = 5   # k = 1,3 ou 5

	#  dimensões das  matrizes:
	[numLinTr, numColTr] = numpy.shape(matTreino) 
	[numLinTs, numColTs] = numpy.shape(matTeste)

	#Rotulos do treino... (última coluna)
	ultColTr = matTreino[:,numColTr-1]
	
	
	#Normalizando...
	ind = numpy.zeros((numLinTr,numColTr-1))
	for x in range(numLinTr): 
		for z in range(numColTr-1):
			ind[x][z]=matTreino[x][z]


	matTr = stats.zscore(matTreino)
	matTs= stats.zscore(matTeste)

	# Calculo da distância euclidiana
	distFn=numpy.zeros((1000,2))
	dist = numpy.zeros((numLinTr, numLinTs))
	vet = []	

	for z in range(numLinTs):
		aux2=[]
		aux2.append(matTs[z][:])
		for i in range(numLinTr):
			aux = []
			aux.append(matTr[i][:-1])
			dist[i][z]=spatial.distance.cdist(aux2,aux)
		
	for m in range(numLinTs):        
		for i in range(numLinTr):
		    distFn[i][0] = dist[i][m]
		    distFn[i][1] = ultColTr[i]

		pos = [0,1,2,3,4]
		cont = [0,0,0,0,0]
		distFn = sorted(distFn, key = lambda x : x[0])
		
		for x in range(k):    #Verifica qual a resposta da maioria
		    for w in range(k):
		        if (distFn[pos[x]][1] == distFn[pos[w]][1]):
		            cont[x] = cont[x] + 1
		
		posf = 0
		
		for x in range(k):  #Seleciona a resposta da maioria
		    if cont[x]>cont[posf]:
		        posf = x
		        
		vet.append(distFn[pos[posf]][1])

	return vet		
